package com.example.webview_test.h5_record;

import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.GeolocationPermissions;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.PermissionRequest;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;

import androidx.annotation.Nullable;

/**
 * @Description XXXXXXXXXXXXX
 * @Author xudan
 * @CreateTime 2024/4/27
 */
public class MyWebChromeClient extends WebChromeClient {
    /**
     * 告诉主机应用程序加载页面的当前进度。
     * 参数：
     * view–启动回调的WebView。
     * newProgress–当前页面加载进度，用0到100之间的整数表示。
     */
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
        Log.i("xd==", "newProgress==" + newProgress);

    }

    /**
     * 将文档标题的更改通知宿主应用程序。
     * 参数：
     * view–启动回调的WebView。
     * title–包含文档新标题的字符串
     */
    @Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);
        Log.i("xd==", "onReceivedTitle==" + title);
    }

    /**
     * 通知主机应用程序当前页面的新收藏夹图标。
     * 参数：
     * view–启动回调的WebView。
     * icon–包含当前页面收藏夹图标的位图。
     */
    @Override
    public void onReceivedIcon(WebView view, Bitmap icon) {
        super.onReceivedIcon(view, icon);
    }

    /**
     * 将apple touch图标的url通知主机应用程序。
     * 参数：
     * view–启动回调的WebView。
     * url–图标url。
     * precomposed–如果url用于预编译的触摸图标，则为true。
     */
    @Override
    public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) {
        super.onReceivedTouchIconUrl(view, url, precomposed);
        Log.i("xd==", "onReceivedTouchIconUrl==" + url);

    }

    /**
     * 将当前页面输入全屏模式通知主机应用程序。在此调用之后，Web内容将不再在WebView中渲染，
     * 而是在视图中呈现。主机应用程序应将此视图添加到使用android.view.windowmanager.layoutparams.flag_fullscreen标志的窗口中，
     * 以便实际显示此Web内容全屏。
     * 该应用程序可以通过调用回调来明确退出全屏模式（例如，当用户按下返回按钮时）。但是，这通常不是必需的，
     * 因为网页通常会显示其自己的UI以关闭全屏。无论WebView如何退出全屏模式，WebView都将调用OnhideCustomView（），
     * 以删除自定义视图的应用程序发出信号。
     * 如果此方法没有被覆盖，WebView将报告到网页上，它不支持全屏模式，并且不会符合网页以全屏模式运行的请求。
     * 注意：如果覆盖了此方法，则应用程序必须override onHideCustomView().
     */
    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        super.onShowCustomView(view, callback);
    }

    /**
     * 通知主机应用程序当前页面已退出全屏模式。主机应用程序必须隐藏自定义视图（以前传递给onshowcustomview（）
     * 的视图）。此通话后，Web内容将再次在原始WebView中渲染。
     * 注意：如果覆盖此方法，则应用程序还必须覆盖onshowcustomview（）。
     */
    @Override
    public void onHideCustomView() {
        super.onHideCustomView();
    }

    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
        return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
    }

    /**
     * 请求显示此WebView的显示和关注点。由于另一个WebView打开了此WebView中的链接并要求显示此WebView，
     * 因此可能会发生这种情况。
     */
    @Override
    public void onRequestFocus(WebView view) {
        super.onRequestFocus(view);
    }

    /**
     * 通知主机应用程序关闭给定的WebView，并在必要时将其从视图系统中删除。此时，WebCore已经停止了此窗口中的
     * 任何加载，并删除了javascript中的任何交叉脚本功能。
     * 与onCreateWindow一样，应用程序应确保显示的任何URL或安全指示符都已更新，
     * 以便用户能够告知他们正在交互的页面已关闭。
     */
    @Override
    public void onCloseWindow(WebView window) {
        super.onCloseWindow(window);
    }

    /**
     * 通知主机应用程序网页要显示JavaScript警报（）对话框。
     * 如果此方法返回false或未被覆盖，则默认行为是显示包含警报消息的对话框，并暂停JavaScript执行，
     * 直到对话框被取消。要显示自定义对话框，应用程序应该从该方法返回true，在这种情况下，默认对话框将不会显示，
     * JavaScript执行将暂停。当自定义对话框被取消时，应用程序应该调用JsResult.confrm（），
     * 以便恢复JavaScript执行。要抑制对话框并允许JavaScript继续执行，请立即调用JsResult.confrm（），
     * 然后返回true。
     * 请注意，如果WebChromeClient设置为null，或者根本没有设置WebChromeClient，则默认对话框将被抑制，Javascript将立即继续执行。
     * 请注意，默认对话框不会继承android.view。陈列父窗口的FLAG_SECURE标志。
     * 如果请求被处理或忽略，则布尔值为true。如果WebView需要显示默认对话框，则为false。
     */
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }

    /**
     * 通知主机应用程序网页要显示JavaScript confirm（）对话框。
     * 如果此方法返回false或未被重写，则默认行为是显示包含消息的对话框，并暂停JavaScript执行，
     * 直到对话框被取消。当用户按下“确认”按钮时，默认对话框将向JavaScript confirm（）代码返回true，
     * 而当用户按下‘取消’按钮或取消对话框时，则会向JavaScript代码返回false。
     * 要显示自定义对话框，应用程序应该从该方法返回true，在这种情况下，默认对话框将不会显示，
     * JavaScript执行将暂停。当取消自定义对话框时，应用程序应调用JsResult.confrm（）或JsResult.cancel（）。
     * 要抑制对话框并允许JavaScript继续执行，请立即调用JsResult.confrm（）或JsResult.cancel（），然后返回true。
     * 请注意，如果WebChromeClient设置为null，或者根本没有设置WebChromeClient，则默认对话框将被抑制，默认值false将立即返回到JavaScript代码中。
     * 请注意，默认对话框不会继承android.view。陈列父窗口的FLAG_SECURE标志。
     */
    @Override
    public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
        return super.onJsConfirm(view, url, message, result);
    }

    /**
     * 通知主机应用程序网页要显示JavaScript prompt（）对话框。
     * 如果此方法返回false或未被重写，则默认行为是显示包含消息的对话框，并暂停JavaScript执行，直到对话框被取消。
     * 对话框关闭后，JavaScript prompt（）将返回用户键入的字符串，如果用户按下“取消”按钮，则返回null。
     * 要显示自定义对话框，应用程序应该从该方法返回true，在这种情况下，默认对话框将不会显示，JavaScript执行将暂停。
     * 取消自定义对话框时，应用程序应调用JsPromptResult.confirm（结果）。
     * 要抑制对话框并允许JavaScript继续执行，请立即调用JsPromptResult.confirm（result），然后返回true。
     * 请注意，如果WebChromeClient设置为null，或者根本没有设置WebChromeClient，则默认对话框将被抑制，null将立即返回到JavaScript代码中。
     * 请注意，默认对话框不会继承android.view。陈列父窗口的FLAG_SECURE标志。
     */
    @Override
    public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
        return super.onJsPrompt(view, url, message, defaultValue, result);
    }

    /**
     * 通知主机应用程序，网页要在加载前确认来自JavaScript的导航。
     * 如果此方法返回false或未被重写，则默认行为是显示包含消息的对话框，并暂停JavaScript执行，直到对话框被取消。
     * 如果用户确认导航，默认对话框将继续导航，如果用户希望停留在当前页面，则默认对话框将停止导航。
     * 要显示自定义对话框，应用程序应该从该方法返回true，在这种情况下，默认对话框将不会显示，JavaScript执行将暂停。
     * 当自定义对话框被取消时，应用程序应该调用JsResult.confrm（）来继续导航，或者调用JsResult.cancel（）
     * 来停留在当前页面上。
     * 要抑制对话框并允许JavaScript继续执行，请立即调用JsResult.confrm（）或JsResult.cancel（），然后返回true。
     * 请注意，如果WebChromeClient设置为null，或者根本没有设置WebChromeClient，则默认对话框将被抑制，导航将立即恢复。
     * 请注意，默认对话框不会继承android.view。陈列父窗口的FLAG_SECURE标志。
     */
    @Override
    public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
        return super.onJsBeforeUnload(view, url, message, result);
    }

    /**
     * 通知主机应用程序来自指定来源的web内容正在尝试使用Geolocation API，但当前未为该来源设置权限状态。
     * 主机应用程序应使用所需的权限状态调用指定的回调。有关详细信息，请参阅地理位置权限。
     * 请注意，对于以Android N和更高版本SDK为目标的应用程序（API级别>Android.os.Build.VERSION_CODES.M），
     * 仅对源自安全来源（如https）的请求调用此方法。在非安全来源地，地理定位请求会被自动拒绝。
     * 参数：
     * origin–试图使用Geolocation API的web内容的来源。callback–用于设置源的权限状态的回调。
     */
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
        super.onGeolocationPermissionsShowPrompt(origin, callback);
    }

    /**
     * 通知主机应用程序先前调用onGeolocationPermissionsShowPrompt（）时请求的地理位置权限已被取消。
     * 因此，任何相关的UI都应该隐藏起来。
     */
    @Override
    public void onGeolocationPermissionsHidePrompt() {
        super.onGeolocationPermissionsHidePrompt();
    }

    /**
     * 通知主机应用程序web内容正在请求访问指定资源的权限，而该权限当前未被授予或拒绝。
     * 主机应用程序必须调用PermissionRequest.grant（String[]）或PermissionRequest.deny（）。
     * 如果未重写此方法，则拒绝该权限。
     */
    @Override
    public void onPermissionRequest(PermissionRequest request) {
        super.onPermissionRequest(request);
    }

    /**
     * 通知主机应用程序给定的权限请求已被取消。因此，任何相关的UI都应该隐藏起来。
     */
    @Override
    public void onPermissionRequestCanceled(PermissionRequest request) {
        super.onPermissionRequestCanceled(request);
    }

    /**
     * 向主机应用程序报告JavaScript控制台消息。ChromeClient应该覆盖这一点，以便在他们认为合适的时候处理日志消息。
     */
    @Override
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
        return super.onConsoleMessage(consoleMessage);
    }

    /**
     * 不播放时，视频元素由“海报”图像表示。可以通过HTML中视频标签的海报属性来指定要使用的图像。
     * 如果该属性不存在，则将使用默认海报。此方法允许ChromeClient提供默认图像。
     */
    @Nullable
    @Override
    public Bitmap getDefaultVideoPoster() {
        return super.getDefaultVideoPoster();
    }

    /**
     * 获取要在进行全屏视频缓冲时显示的视图。主机应用程序可以覆盖此方法，以提供包含微调器或类似项的视图。
     * 查看加载视频时要显示的视图。
     */
    @Nullable
    @Override
    public View getVideoLoadingProgressView() {
        return super.getVideoLoadingProgressView();
    }

    /**
     * 获取所有访问历史项目的列表，用于链接着色
     *
     * @param callback
     */
    @Override
    public void getVisitedHistory(ValueCallback<String[]> callback) {
        super.getVisitedHistory(callback);
    }

    /**
     * 告诉客户端显示一个文件选择器。调用它是为了处理具有“文件”输入类型的HTML表单，以响应用户按下“选择文件”按钮。
     * 若要取消请求，请调用filePathCallback.onReceiveValue（null）并返回true。
     * 参数：
     * webView–启动请求的webView实例。
     * filePathCallback–调用此回调以提供要上载的文件的路径列表，或null以取消。只有在onShowFileChooser实现返回true时才能调用。fileChooserParameters–描述要打开的文件选择器的模式以及与之一起使用的选项。
     * 如果将调用filePathCallback，则为true；如果使用默认处理，则为false。
     * 另请参阅：
     * WebChromeClient。文件选择器参数
     */
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
    }
}
